package com.javaforever.clocksimplejee4.facade;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.baidu.ai.aip.utils.Base64Util;
import com.javaforever.clocksimplejee4.domain.ClockRecord;
import com.javaforever.clocksimplejee4.domain.User;
import com.javaforever.clocksimplejee4.service.ClockRecordService;
import com.javaforever.clocksimplejee4.service.UserService;
import com.javaforever.clocksimplejee4.serviceimpl.ClockRecordServiceImpl;
import com.javaforever.clocksimplejee4.serviceimpl.FaceServiceImpl;
import com.javaforever.clocksimplejee4.serviceimpl.UserServiceImpl;
import com.javaforever.clocksimplejee4.utils.AppTokenManager;

import net.sf.json.JSONObject;

/**
 * Servlet implementation class ClockRecordClockController
 */
public class FaceClockFacade extends HttpServlet {
	
     protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	     response.setContentType("text/html;charset=UTF-8");
	     PrintWriter out = response.getWriter();
	     Map<String, Object> result = new TreeMap<String,Object>();
	     try {
	    	 String imageData = request.getParameter("image");
	         String description = request.getParameter("description");
	         String token = request.getParameter("token"); 
	         Long userId = AppTokenManager.getUserIdByToken(token);
	         
	    	 UserService userService = new UserServiceImpl();	
	    	 FaceServiceImpl fimpl = new FaceServiceImpl();
	         User user = userService.findUserByFace(imageData);	  
	         if (user.getId()>0 && user.getScore()>78 && fimpl.detectOneValidFace(Base64Util.decode(imageData))) {
		         if (userId!=user.getId()) throw new Exception("Login user is not equal to the face.");
		         ClockRecordService clockRecordService = new ClockRecordServiceImpl();
		         long cid = clockRecordService.clock(user, description);
		         ClockRecord cr = clockRecordService.findClockRecordById(cid);
		         
	             result.put("success", true);
	             result.put("data", cr);
	             result.put("user", user);
	             out.println(JSONObject.fromObject(result));
	         } else {
	        	 result.put("success", false);
	        	 result.put("errorMessage", "Clock fails.");
	             result.put("score", user.getScore());
	             out.println(JSONObject.fromObject(result));
	         }
	     } catch (Exception e){
	    	 e.printStackTrace();
             result.put("success", false);
             result.put("score", 0);
             result.put("errorMessage","Clock fails.");
             out.println(JSONObject.fromObject(result));
          } finally {
	         out.close();
	     }
 }


 // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
 /**
  * Handles the HTTP <code>GET</code> method.
  * @param request servlet request
  * @param response servlet response
  * @throws ServletException if a servlet-specific error occurs
  * @throws IOException if an I/O error occurs
  */
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
     processRequest(request, response);
 }

 /**
  * Handles the HTTP <code>POST</code> method.
  * @param request servlet request
  * @param response servlet response
  * @throws ServletException if a servlet-specific error occurs
  * @throws IOException if an I/O error occurs
  */
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
     processRequest(request, response);
 }

 /**
  * Returns a short description of the servlet.
  * @return a String containing servlet description
  */
 @Override
 public String getServletInfo() {
     return "Short description";
 }// </editor-fold>

}
